/**
 * 基于浏览器的分析
 */
let num = 20;
const obj = {
  num: 10,
  func: num => {
    // 箭头函数，执行的时候本身没有this，理解为通过作用域链找到全局的this，即为window
    this.num += 5;
    // 因此这儿打印 25
    console.log(this.num);
    // 下面有var声明的num，num提升，同时num也作为函数参数传进来，因此num = 40
    num += 5;
    // 40 + 5  -> 45，这儿打印45
    console.log(num);
    // 赋值num = 30
    var num = 30;

    return function () {
      // 匿名函数，在全局作用域下调用的，this也为window
      this.num += 4;
      // 25 + 4 = 29
      console.log(this.num); // 29
      // 闭包保存了外层函数的num = 30
      num += 10;
      // 30 + 10 = 40
      console.log(num); // 40
    };
  },
};

obj.func(40)();

/**
 * 基于Nodejs的分析
 * Node.js REPL 环境中，所有代码都是真正意义上执行在全局作用域的。而在文件模块中的代码最终是被拼接到一个 IIFE 中执行的，
 * 所以并不是全局环境。具体表现就是 REPL 中的 this === global。而文件中是不相等的，还有就是文件中可以访问到 __dirname 和 __filename。
 */
